package val

//Value 允许你将预定义的值直接注入到依赖图中，而不需要编写构造函数。
/*
Value 的注意事项:
不可变值：wire.Value 应该用于注入不可变的值，如配置、常量等。
避免复杂逻辑：如果需要复杂初始化逻辑，应该使用 provider 函数而不是 wire.Value。
类型匹配：注入的值类型必须与接收参数的类型完全匹配。
接口注入：当注入接口时，确保注入的值实现了该接口。

*/

import (
	"fmt"
	"log"
)

type DatabaseConfig struct {
	Host     string
	Port     int
	Username string
	Password string
}

type App struct {
	DBConfig DatabaseConfig
	Log      ILogger
}

type ILogger interface {
	Log(message string)
}

type FileLogger struct{}

func (l *FileLogger) Log(message string) {
	fmt.Println("Log to file:", message)
}
func NewFileLogger() *FileLogger {
	return &FileLogger{}
}

func NewApp(config DatabaseConfig, Log ILogger) *App {
	return &App{DBConfig: config, Log: Log}
}

func RunMain() {
	// 使用 wire.Value 注入预定义的配置
	app, err := InitializeApp()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("App config: %+v\n", app.DBConfig)
}
